import 'package:flutter/material.dart';
/// 自定义布局多个子控件的位置
/// 可将子控件摆在任意位置
main(List<String> args) {
  runApp(MaterialApp(
    home: HomePage(),
  ));
}

class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HomePage'),
      ),
      body: CustomMultiChildLayout(
        delegate: MyDelegate(),
        children: [
          LayoutId(
            id: MyId.id1,
            child: FlutterLogo(
              size: 50,
            ),
          ),
          LayoutId(
            id: MyId.id2,
            child: FlutterLogo(
              size: 100,
            ),
          ),
        ],
      ),
    );
  }
}

enum MyId { id1, id2 }

class MyDelegate extends MultiChildLayoutDelegate {
  // 参数是CustomMultiChildLayout的大小
  @override
  void performLayout(Size size) {
    Size logo1Size=Size(0, 0);

    if (hasChild(MyId.id1)) {
      // 第一步：向下传递约束，获取子控件大小
      logo1Size = layoutChild(
        // 宽松约束，直接传递本控件的大小,可以让子控件自己设置大小
        // 也可以传递紧约束
          MyId.id1, BoxConstraints.loose(size)); 
      // 第二步：确定子控件位置
      positionChild(MyId.id1, Offset(0, 0));
    }

    if (hasChild(MyId.id2)) {
      // 同理
      layoutChild(MyId.id2, BoxConstraints.loose(size));
      positionChild(MyId.id2, Offset(logo1Size.width, logo1Size.height));
    }
  }

  @override
  bool shouldRelayout(covariant MultiChildLayoutDelegate oldDelegate) {
    return true;
  }

  // @override
  // Size getSize(BoxConstraints constraints) {
  //   // 重写该方法以固定所有子控件大小
  //   // return super.getSize(constraints);
  //   return Size(20, 20);
  // }
}
